package com.ruoyi.common.qy.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * Unix时间戳转换工具类
 * 支持秒级和毫秒级时间戳的自动检测和转换
 */
public class UnixTimestampConverter {

    // 常见的时间格式
    private static final DateTimeFormatter DEFAULT_FORMATTER =
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter ISO_FORMATTER =
        DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    private static final DateTimeFormatter CHINESE_FORMATTER =
        DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");

    /**
     * 判断时间戳的单位（秒级还是毫秒级）
     */
    public static boolean isSecondsTimestamp(long timestamp) {
        // 如果时间戳小于 10000000000L (公元2286年)，则认为是秒级
        // 如果时间戳大于 1000000000000L (公元2001年)，则认为是毫秒级
        return timestamp < 10000000000L;
    }

    /**
     * 标准化时间戳（统一转换为毫秒）
     */
    public static long normalizeToMillis(long timestamp) {
        if (isSecondsTimestamp(timestamp)) {
            return timestamp * 1000L;
        }
        return timestamp;
    }

    /**
     * 标准化时间戳（统一转换为秒）
     */
    public static long normalizeToSeconds(long timestamp) {
        if (!isSecondsTimestamp(timestamp)) {
            return timestamp / 1000L;
        }
        return timestamp;
    }

    /**
     * Unix时间戳转时间字符串（默认格式）
     */
    public static String timestampToString(long timestamp) {
        return timestampToString(timestamp, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * Unix时间戳转时间字符串（自定义格式）
     */
    public static String timestampToString(long timestamp, String pattern) {
        long millis = normalizeToMillis(timestamp);
        Instant instant = Instant.ofEpochMilli(millis);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * Unix时间戳转时间字符串（指定时区）
     */
    public static String timestampToString(long timestamp, String pattern, String zoneId) {
        long millis = normalizeToMillis(timestamp);
        Instant instant = Instant.ofEpochMilli(millis);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.of(zoneId));
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }
}
